
package TokensDelLenguaje;

import PolacaInversa.Registro;
import java.util.ArrayList;


public class Token_OperadorResta extends Token_Operador {

    public Token_OperadorResta(){
        super(Tokens.resta);
    }
    
    // Falta el informe de errores, que iría en el último else
    public ArrayList conversionImplicita(Token o1, Token o2, Registro reg) {
        ArrayList list = new ArrayList();
        String s = "";
        Tokens op1 = o1.getId();
        Tokens op2 = o2.getId();

        //La logica de la tabla de conversion para este operador
        if (op1 == Tokens.const_uinteger && op2 == Tokens.const_uinteger) {
            if(!reg.nombre.equals(o2.getNombre())){
                s += "MOV " + reg.nombre + ", " + o2.getNombre() + "\n";
            }                
            //s += "SUB " + reg.nombre + ", " + o1.getNombre() + "\n";
            list.add(s);
        }
            else if (op1 == Tokens.const_ulongint && op2 == Tokens.const_ulongint) {
                if(!reg.nombre.equals(o2.getNombre())){
                    s += "MOV " + reg.nombre + ", " + o2.getNombre() + "\n";
                }
                //s += "SUB " + reg.nombre + ", " + o1.getNombre() + "\n";
                list.add(s);
            }
                else if (op1 == Tokens.const_uinteger && op2 == Tokens.const_ulongint) {

                    if(!o2.esRegistro()){
                        s = conversion(o1,reg);
                        list.add(s);
                    }
                    else{
                        s = conversion(o1,new Registro("eax", 4));
                        list.add(s);
                    }
                }
                    else if (op1 == Tokens.const_ulongint && op2 == Tokens.const_uinteger) {
                        //Generar Assembler.
                            s = conversion(o2,reg);
                            list.add(s);
                    }
        list.add(0, true);
        return list;
    }
    
    @Override
    public ArrayList traducir_assembler(Token o1, Token o2, Registro reg){
        ArrayList list = super.traducir_assembler(o1, o2, reg);
        ArrayList l = new ArrayList();
        String s = (String) list.get(1);
        if (o1.getId() == Tokens.const_uinteger && o2.getId() == Tokens.const_ulongint)
            if(!o2.esRegistro())
                s += "SUB " + reg.nombre + ", " + o1.getNombre() + "\n";
            else
                s += "SUB " + reg.nombre + ", eax\n";
        else
            if(!o1.esRegistro())
                s += "SUB " + reg.nombre + ", " + o1.getNombre() + "\n";
            else
                s += "SUB " + reg.nombre + ", eax\n";

        s += "JS res_negativo\n";
        l.add(true);
        l.add(s);
        return l;
    }
    
}
